package com.javiermoreno.openbankof.gestiontransferencias;

import com.javiermoreno.bankof.dominio.CuentaCorriente;
import com.javiermoreno.bankof.servicios.GestionProductosFinancierosServ;
import com.javiermoreno.bankof.servicios.GestionProductosFinancierosServFactory;
import com.javiermoreno.framework.errores.BusinessException;
import java.io.IOException;
import java.util.ArrayList;
import java.util.Date;
import java.util.List;
import java.util.Set;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
import javax.servlet.RequestDispatcher;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

/**
 *
 * @author Administrador
 */
public class TransferenciasServlet extends HttpServlet {
    
    private void mostrarFormulario(
            HttpServletRequest req, HttpServletResponse resp, List<String> errores) 
    throws ServletException, IOException {        

        String username = (req.getUserPrincipal() == null) ? 
                           null : req.getUserPrincipal().getName();
        
        GestionProductosFinancierosServ servicio =
                GestionProductosFinancierosServFactory.crear();       
        Set<CuentaCorriente> cuentas = servicio.obtenerCuentasCorrienteCliente(username);
        
        req.setAttribute("cuentasUsuarioActual", cuentas);
        req.setAttribute("fecha", new Date());
                
        if (errores != null) {
            req.setAttribute("listaErrores", errores);
        }
        
        RequestDispatcher dispatcher = req.getRequestDispatcher("index.jsp");
        dispatcher.forward(req, resp);
    }
    
    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) 
    throws ServletException, IOException {       
        
        this.mostrarFormulario(req, resp, null);
        
    }

    @Override
    protected void doPost(HttpServletRequest req, HttpServletResponse resp) 
    throws ServletException, IOException {
        if (req.getParameter("aceptar") != null) {
            List<String> errores = this.validarFormulario(req);
            if (errores.isEmpty() == true) {
                this.ejecutarTransferencia(req, resp);
            } else {
                this.mostrarFormulario(req, resp, errores);
            }            
        }
        if (req.getParameter("cancelar") != null) {
            this.ejecutarCancelar(req, resp);
        }
        if (req.getParameter("ayuda") != null) {
            this.ejecutarAyuda(req, resp);
        }
        if (req.getParameter("volver") != null) {
            this.ejecutarVolver(req, resp);
        }
        
    }

    private void ejecutarCancelar(HttpServletRequest req, HttpServletResponse resp) 
    throws ServletException, IOException {
        String contextPath = super.getServletContext().getContextPath();
        resp.sendRedirect(contextPath + "/index.jsp");
    }

    private void ejecutarAyuda(HttpServletRequest req, HttpServletResponse resp) 
    throws ServletException, IOException {
        RequestDispatcher dispatcher = req.getRequestDispatcher("ayuda.jsp");
        dispatcher.forward(req, resp);
    }
    
    
    private void ejecutarVolver(HttpServletRequest req, HttpServletResponse resp) 
    throws ServletException, IOException {
        mostrarFormulario(req, resp, null);
    }

    private List<String> validarFormulario(HttpServletRequest req) {
        List<String> errores = new ArrayList<String>();
        
        String origen = req.getParameter("origen");
        if (origen.isEmpty() == true) {
            errores.add("Origen es obligatorio.");
        } else {
            Pattern pattern = Pattern.compile("^\\d{4}$");
            Matcher matcher = pattern.matcher(origen);
            if (matcher.matches() == false) {
                errores.add("Formato de origen incorrecto.");
            }
        }
        
        String destino = req.getParameter("destino");
        if (destino.isEmpty() == true) {
            errores.add("Destino es obligatorio.");
        } else {
            Pattern pattern = Pattern.compile("^\\d{4}$");
            Matcher matcher = pattern.matcher(destino);
            if (matcher.matches() == false) {
                errores.add("Formato de destino incorrecto.");
            }
        }
        
        try {
            double importe = Double.parseDouble(req.getParameter("importe"));
            if (importe < 0) {
                errores.add("El importe no puede ser negativo.");
            } else if (importe > 1000.0) {
                errores.add("El importe no puede ser superior a 1000€");
            }
        } catch(NumberFormatException exc) {
            errores.add("Importe incorrecto.");
        }
        
        return errores;
    }

    private void ejecutarTransferencia(HttpServletRequest req, HttpServletResponse resp) 
    throws IOException, ServletException {
        try {
            String username = (req.getUserPrincipal() == null) ? 
                            null : req.getUserPrincipal().getName();

            String codigoOrigen = req.getParameter("origen");
            String codigoDestino = req.getParameter("destino");
            double importe = Double.parseDouble(req.getParameter("importe"));

            GestionProductosFinancierosServ servicio =
                    GestionProductosFinancierosServFactory.crear();    
            servicio.ejecutarTransferencia(username, codigoOrigen, codigoDestino, importe);

            resp.sendRedirect("exito.jsp");
        } catch (BusinessException exc) {
            List<String> errores = new ArrayList<String>();
            errores.add(exc.getMessage());
            this.mostrarFormulario(req, resp, errores);
        }
        
    }
    
    
    
}
